package comum.so;

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.List;

import comum.rn.RNDescricaoSalaJogo;
import comum.rn.RNEstatisticas;
import comum.rn.RNInfoSalaJogo;
import comum.rn.RNJogada;
import comum.rn.RNPeca;
import comum.so.exception.FalhaComunicacaoBancoDadosException;
import comum.so.exception.FalhaValidacaoException;
import comum.so.exception.JaExistePerfilCadastradoComEsseLoginException;
import comum.so.exception.LoginEmUsoException;
import comum.so.exception.SalaCheiaException;
import comum.so.exception.SalaComNomeJaExistenteException;
import comum.so.exception.SalaNaoExisteException;
import comum.so.exception.SenhaIncorretaException;

public interface SOServidorEntrada extends Remote {
	void fazerLogin(String identificador, String senha,
			SOClienteEntrada clienteEntrada) throws RemoteException,
			FalhaValidacaoException, LoginEmUsoException,
			FalhaComunicacaoBancoDadosException;

	void cadastrarNovoPerfil(String identificador, String senha,
			SOClienteEntrada clienteEntrada) throws RemoteException,
			JaExistePerfilCadastradoComEsseLoginException;

	void deslogar(String identificador) throws RemoteException;

	List<RNDescricaoSalaJogo> buscarSalasJogo(boolean mostrarCheios,
			boolean mostrarComSenha) throws RemoteException;

	RNInfoSalaJogo entrarSalaJogo(String identificador, Long idSalaJogo,
			String senha) throws RemoteException, SalaCheiaException,
			SalaNaoExisteException, SenhaIncorretaException;

	RNInfoSalaJogo criarSalaJogo(String nome, String senha, String identificador)
			throws RemoteException, SalaComNomeJaExistenteException;

	RNEstatisticas obterEstatisticas(String identificador)
			throws RemoteException;

	void sairSalaEspera(Long idSalaJogo, String identificador)
			throws RemoteException;

	void desistirJogo(Long idSalaJogo, String identificador)
			throws RemoteException;

	boolean entrarMesa(int posicaoDesejada, Long idSalaJogo,
			String identificador) throws RemoteException;

	void sairMesa(Long idSalaJogo, String identificador) throws RemoteException;
	
	void fazerJogada(String identificador, Long idSalaJogo, RNJogada jogada)
			throws RemoteException;
	
	void informarInicioPartida(String jogadorQueRecebe, List<RNPeca> pecas, String primeiroAJogar) throws RemoteException;
	
	void informarFimPartida(String jogadorRecebe, String mensagem)
			throws RemoteException;

	void informarMudancaMesa(String jogadorRecebe, Integer[] posicoesMesa)
			throws RemoteException;

	void informarJogada(String jogadorQueRecebe, String jogadorQueJogou,
			RNJogada jogada, String novoJogadorEmTurno) throws RemoteException;
	
	void iniciarPartida(Long idSalaJogo) throws RemoteException;

	void informarSaidaJogador(String jogadorRecebe, String jogadorQueSaiu,
			RNInfoSalaJogo infoSalaJogo) throws RemoteException;

	void informarEntradaJogador(String jogadorRecebe, String jogadorQueEntrou,
			RNInfoSalaJogo infoSalaJogo) throws RemoteException;

	

	

}
